package com.fanli.udf;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.hadoop.hive.ql.exec.UDF;

public class URLParser extends UDF {
	public URLParser(){
		//初始化
		readString();
	}
	private Set<ConfigPath> configPaths = new HashSet<ConfigPath>();
	private List<ConfigPath> cp = new ArrayList<ConfigPath>();

	public Set<ConfigPath> readString(){
		// http://blog.csdn.net/tiandiqing/article/details/6536384 路径参考资料
//		    String workPath=System.getProperty("user.dir"); //用户的当前工作目录
//		    String splitStr = System.getProperty("file.separator");//所在系统文件分隔符
//	        File file=new File(workPath+splitStr+"s_abtest_spmandlc.txt");
		File file=new File("s_abtest_spmandlc.txt");// 生成文件依赖作业 dim.s_abtest_spmandlc.sh


		try {
			FileInputStream is=new FileInputStream(file);
			InputStreamReader isr= new InputStreamReader(is);
			BufferedReader in= new BufferedReader(isr);
			String line=null;
			while( (line=in.readLine())!=null )
			{
				ConfigPath configPath=new ConfigPath();
				String vars[] = line.split("\t");
				for(int i = 0;i< vars.length;i++){
					if(i==0)configPath.setId(vars[0]);
					if(i==1)configPath.setTestId(vars[1]);
					else if(i==2)configPath.setStoryId(vars[2]);
					else if(i==3)configPath.setGroupName(vars[3]);
						//hive中维护的%号在java中未找到其对应的意义，用意思一致的。*代替
					else if(i==4)configPath.setUrl(vars[4].replaceAll("%", ".*"));
				}
				configPaths.add(configPath);
			}
			in.close();
			is.close();
		} catch (IOException e) {
			System.out.println("文件读取异常！！");
			e.printStackTrace();
		}
		return configPaths;
	}
	//flag=1为首次匹配则退出，其他则多次匹配
	public String evaluate(String path,int flag){
		cp = new ArrayList<ConfigPath>();
		if(path.trim().length()>0){
			Set<String> diff = new HashSet<String>();
			for(ConfigPath configPath:configPaths){
//				路径是否符合维护的正则表达式
				//路径不存在，进行下一次循环
				if(null==configPath.getUrl()) continue;
				//正则表达式模式匹配
				Pattern pattern = Pattern.compile(configPath.getUrl());
				Matcher matcher = pattern.matcher(path);
				if(matcher.matches()){
					if(diff.contains(configPath.getTestId())){
						configPath.setIsLike(1);
					}
					diff.add(configPath.getTestId());
					//匹配上添加到 cp集合中
					cp.add(configPath);
					if(1==flag){break;}
				};
			}
		}
		//返回匹配出来的数据，呈现形式如下
		//test_id=50361&story_id=23813&group_name=c,test_id=50361&story_id=23813&group_name=d
		//在hive中解析产生的数据
		return cp.toString().replaceAll("\\[|\\]| ", "");
	}
	public static void main(String[] args) {
		URLParser ur = new URLParser();
		String str = ur.evaluate("http://super.fanli.com/h5/lastday?lc=superh5_last_product&devid=69382648484580&c_aver=1.0&c_src=2&c_v=5.2.0.34&abtest=17454_a-32579_b-72_d-138_b-118_b-9822_b-54_a-5060&c_nt=wifi&mc=12",0);
		for(int i=0;i<=5;i++){
			ur.evaluate("http://super.fanli.com/h5/lastday?lc=superh5_last_product&devid=69382648484580&c_aver=1.0&c_src=2&c_v=5.2.0.34&abtest=17454_a-32579_b-72_d-138_b-118_b-9822_b-54_a-5060&c_nt=wifi&mc=12",0);
		}
		System.out.println(str);
		System.out.println("".replaceAll("\\[|\\]", ""));

	}

}


